import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QStackedWidget, QVBoxLayout, \
    QHBoxLayout, QLabel
from PyQt5.QtCore import Qt


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建主布局
        main_layout = QHBoxLayout()

        # 创建左侧的 QTreeWidget
        self.tree_widget = QTreeWidget()
        self.tree_widget.setColumnCount(1)
        self.tree_widget.setHeaderLabels(['菜单'])

        # 创建右侧的 QStackedWidget
        self.stacked_widget = QStackedWidget()

        # 菜单项和对应的页面内容
        menu_items = ['页面 1', '页面 2', '页面 3']
        for item_text in menu_items:
            # 创建树节点
            item = QTreeWidgetItem(self.tree_widget)
            item.setText(0, item_text)

            # 创建对应的页面
            page = QLabel(f'这是 {item_text} 的内容')
            # 将页面对象附着在树节点上
            item.setData(0, Qt.UserRole, page)
            # 将页面添加到 QStackedWidget 中
            self.stacked_widget.addWidget(page)

        # 连接树节点点击事件
        self.tree_widget.itemClicked.connect(self.on_tree_item_clicked)

        # 将 QTreeWidget 和 QStackedWidget 添加到主布局
        main_layout.addWidget(self.tree_widget)
        main_layout.addWidget(self.stacked_widget)

        # 设置主布局
        self.setLayout(main_layout)

        # 设置窗口属性
        self.setWindowTitle('TreeWidget 页面切换示例')
        self.setGeometry(300, 300, 800, 600)

    def on_tree_item_clicked(self, item, column):
        # 获取附着在树节点上的页面对象
        page = item.data(0, Qt.UserRole)
        # 获取该页面对象在 QStackedWidget 中的索引
        index = self.stacked_widget.indexOf(page)
        # 切换到对应的页面
        self.stacked_widget.setCurrentIndex(index)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
